package com.sam.designpattern.command;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: Sam
 * @Date: 2022-08-26 16:22
 * @Description: 计算器类，计算器上有加减法按钮
 */
public class Calculator {

    /**
     * 持有执行加法的命令对象
     */
    private Command addCmd = null;
    /**
     * 持有执行减法的命令对象
     */
    private Command substractCmd = null;

    /**
     * 命令操作的历史记录，在撤销时使用
     */
    private List<Command> undoCmds = new ArrayList<>();

    /**
     * 命令操作的历史记录，在恢复时使用
     */
    private List<Command> redoCmds = new ArrayList<>();

    public void setAddCmd(Command addCmd) {
        this.addCmd = addCmd;
    }

    public void setSubstractCmd(Command substractCmd) {
        this.substractCmd = substractCmd;
    }

    /**
     * 提供给客户使用，执行加法功能
     */
    public void addPressed() {
        this.addCmd.execute();
        //将操作记录记录到可撤销历史记录中
        this.undoCmds.add(this.addCmd);
    }

    /**
     * 提供给客户使用，执行减法功能
     */
    public void substractPressed() {
        this.substractCmd.execute();
        //将操作记录记录到可撤销历史记录中
        this.undoCmds.add(this.substractCmd);
    }

    /**
     * 提供给客户使用，执行撤销功能
     */
    public void undoPressed() {
        if (this.undoCmds.size() > 0) {
            //去除最后一个命令来撤销
            Command cmd = this.undoCmds.get(this.undoCmds.size() - 1);
            cmd.undo();
            //将操作记录记录到可恢复历史记录中
            this.redoCmds.add(cmd);
            //然后把最后一个撤销命令删除掉
            this.undoCmds.remove(cmd);
        } else {
            System.out.println("很抱歉，没有可撤销的命令");
        }
    }

    /**
     * 提供给客户使用，执行恢复功能
     */
    public void redoPressed() {
        if (this.redoCmds.size() > 0) {
            //去除最后一个命令来撤销
            Command cmd = this.redoCmds.get(this.redoCmds.size() - 1);
            cmd.execute();
            //将操作记录记录到可撤销历史记录中
            this.undoCmds.add(cmd);
            //然后把最后一个恢复命令删除掉
            this.redoCmds.remove(cmd);
        } else {
            System.out.println("很抱歉，没有可恢复的命令");
        }
    }
}
